/**
* Agenda Emmpresario
* @author Naok
* @version 0.1
*/
package agendaempresario;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * AgendaEmpresario
 * @author Naok
 * @version %I%, %G%
 */
public class AgendaEmpresario {

    /**
     * El punto de entrada de la aplicación
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        AgendaEmpresario ae = new AgendaEmpresario();
        ae.run();
    }
    List<Cita> ListaCitas;

    /**
	 * El constructor
     */
    public AgendaEmpresario() {
        System.out.println("Inicializando");
        ListaCitas = new ArrayList<>();
    }

    /**
     * Contiene el bucle principal del programa. Todas las entradas del usuario
     * se producen en este método. En consecuencia, todas las pausas y esperas.
     * Este es el único código que no fluye como un río en primavera.
     */
    public void run() {
        int opcionMenu;
        Date d;
        do {
            mostrarMenu();

            opcionMenu = -1;
            String entrada;
            entrada = Consola.readLine();
            if (isNumeric(entrada)) {
                opcionMenu = Integer.parseInt(entrada);
            }

            switch (opcionMenu) {
                case 1:
                    d = leeFecha("introducir");
                    if (d != null) {
                        System.out.println("Introduce el texto de la cita: ");
                        entrada = Consola.readLine();
                        Cita c = new Cita(d, entrada);
                        introducirCita(c);
                    }
                    break;
                case 2:
                    d = leeFecha("eliminar");
                    eliminarCita(d);
                    break;
                case 3:
                    d = leeFecha("buscar");
                    buscarCita(d);
                    break;
                case 4:
                    mostrarTodos();
                    break;
                default:
                    opcionMenu = -1;
                    break;
            }
        } while (opcionMenu >= 0);
    }

    /**
     * Recoge la fecha introducida por el usuario
     * @param s Indica la acción que se va a realizar y de la que se va a informar al usuario
     * @return La fecha escrita por el usuario o null si no ha introducido una fecha válida
     */
    private Date leeFecha(String s) {
        String entrada;
        Date d;
        System.out.println("Introduce la fecha a " + s + " (d-m-yyyy): ");
        entrada = Consola.readLine();
        d = isDate(entrada);
        return d;
    }

    /**
     * Muestra el menú en pantalla
     */
    private void mostrarMenu() {
        System.out.println("");
        System.out.println("1. Introducir cita");
        System.out.println("2. Eliminar cita");
        System.out.println("3. Buscar día");
        System.out.println("4. Mostrar todas las citas");
        System.out.println("");
    }

    /**
     * Introduce una cita en la agenda
     * @param c La cita que se debe de introducir
     */
    private void introducirCita(Cita c) {
        ListaCitas.add(c);
    }

    /**
     * Elimina una cita de la agenda
     * @param d La fecha de la cita que se debe de eliminar
     */
    private void eliminarCita(Date d) {
        for (Cita c : ListaCitas) {
            if (c.getFecha().equals(d)) {
                ListaCitas.remove(c);
                return;
            }
        }
    }

    /**
     * Busca una cita en la agenda
     * @param d La fecha de la cita a buscar
     */
    private void buscarCita(Date d) {
        for (Cita c : ListaCitas) {
            if (c.getFecha().equals(d)) {
                System.out.println(c.getFecha() + " - " + c.getTexto());
                return;
            }
        }
    }

    /**
     * Muestra todos las citas contenidas en la agenda
     */
    private void mostrarTodos() {
        for (Cita c : ListaCitas) {
            System.out.println(c.getFecha() + " - " + c.getTexto());
        }
    }

    /**
     * Comprueba que una cadena se puede convertir en un número entero
     * @param aStringValue La cadena a convertir
     * @return Devuelve true si se puede, false si no
     */
    public static boolean isNumeric(String aStringValue) {
        Pattern pattern = Pattern.compile("\\d+");
        Matcher matcher = pattern.matcher(aStringValue);
        return matcher.matches();
    }

    /**
     * Convierte una cadena a una fecha
     * @param aStringValue La cadena que se quiere convertir
     * @return La fecha en la que se ha convertido o nulo si la conversión falló
     */
    public static Date isDate(String aStringValue) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
            Date d = sdf.parse(aStringValue);
            // Date d = DateFormat.getDateInstance().parse(aStringValue);
            return d;
        } catch (Exception e) {
        }
        return null;
        /*
         * Pattern pattern = Pattern.compile("^[0-1][1-9][- /
         * ]?(0[1-9]|[12][0-9]|3[01])[- /]?(18|19|20|21)\\d{2}$",
         * Pattern.CASE_INSENSITIVE); Matcher matcher =
         * pattern.matcher(aStringValue); return matcher.matches();
         */
    }
}
